package com.sheng.leetcode.year2023.month02.day28;

import org.junit.Test;

import java.util.*;

/**
 * @author liusheng
 * @date 2023/02/28
 * <p>
 * 2363. 合并相似的物品<p>
 * <p>
 * 给你两个二维整数数组 items1 和 items2 ，表示两个物品集合。每个数组 items 有以下特质：<p>
 * items[i] = [valuei, weighti] 其中 valuei 表示第 i 件物品的 价值 ，weighti 表示第 i 件物品的 重量 。<p>
 * items 中每件物品的价值都是 唯一的 。<p>
 * 请你返回一个二维数组 ret，其中 ret[i] = [valuei, weighti]， weighti 是所有价值为 valuei 物品的 重量之和 。<p>
 * 注意：ret 应该按价值 升序 排序后返回。<p>
 * <p>
 * 示例 1：<p>
 * 输入：items1 = [[1,1],[4,5],[3,8]], items2 = [[3,1],[1,5]]<p>
 * 输出：[[1,6],[3,9],[4,5]]<p>
 * 解释：<p>
 * value = 1 的物品在 items1 中 weight = 1 ，在 items2 中 weight = 5 ，总重量为 1 + 5 = 6 。<p>
 * value = 3 的物品再 items1 中 weight = 8 ，在 items2 中 weight = 1 ，总重量为 8 + 1 = 9 。<p>
 * value = 4 的物品在 items1 中 weight = 5 ，总重量为 5 。<p>
 * 所以，我们返回 [[1,6],[3,9],[4,5]] 。<p>
 * <p>
 * 示例 2：<p>
 * 输入：items1 = [[1,1],[3,2],[2,3]], items2 = [[2,1],[3,2],[1,3]]<p>
 * 输出：[[1,4],[2,4],[3,4]]<p>
 * 解释：<p>
 * value = 1 的物品在 items1 中 weight = 1 ，在 items2 中 weight = 3 ，总重量为 1 + 3 = 4 。<p>
 * value = 2 的物品在 items1 中 weight = 3 ，在 items2 中 weight = 1 ，总重量为 3 + 1 = 4 。<p>
 * value = 3 的物品在 items1 中 weight = 2 ，在 items2 中 weight = 2 ，总重量为 2 + 2 = 4 。<p>
 * 所以，我们返回 [[1,4],[2,4],[3,4]] 。<p>
 * <p>
 * 示例 3：<p>
 * 输入：items1 = [[1,3],[2,2]], items2 = [[7,1],[2,2],[1,4]]<p>
 * 输出：[[1,7],[2,4],[7,1]]<p>
 * 解释：<p>
 * value = 1 的物品在 items1 中 weight = 3 ，在 items2 中 weight = 4 ，总重量为 3 + 4 = 7 。<p>
 * value = 2 的物品在 items1 中 weight = 2 ，在 items2 中 weight = 2 ，总重量为 2 + 2 = 4 。<p>
 * value = 7 的物品在 items2 中 weight = 1 ，总重量为 1 。<p>
 * 所以，我们返回 [[1,7],[2,4],[7,1]] 。<p>
 * <p>
 * 提示：<p>
 * 1 <= items1.length, items2.length <= 1000<p>
 * items1[i].length == items2[i].length == 2<p>
 * 1 <= valuei, weighti <= 1000<p>
 * items1 中每个 valuei 都是 唯一的 。<p>
 * items2 中每个 valuei 都是 唯一的 。<p>
 * <p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/merge-similar-items">2363. 合并相似的物品</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode2363 {

    @Test
    public void test01() {
//        int[][] items1 = {{1, 1}, {4, 5}, {3, 8}}, items2 = {{3, 1}, {1, 5}};
//        int[][] items1 = {{1, 1}, {3, 2}, {2, 3}}, items2 = {{2, 1}, {3, 2}, {1, 3}};
        int[][] items1 = {{1, 3}, {2, 2}}, items2 = {{7, 1}, {2, 2}, {1, 4}};
        System.out.println(new Solution().mergeSimilarItems(items1, items2));
    }
}

class Solution {
    public List<List<Integer>> mergeSimilarItems(int[][] items1, int[][] items2) {
        Map<Integer, Integer> map = new HashMap<>(16);
        for (int[] ints : items1) {
            map.put(ints[0], map.getOrDefault(ints[0], 0) + ints[1]);
        }
        for (int[] ints : items2) {
            map.put(ints[0], map.getOrDefault(ints[0], 0) + ints[1]);
        }
        List<List<Integer>> arrayList = new ArrayList<>();
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            ArrayList<Integer> list = new ArrayList<>();
            list.add(entry.getKey());
            list.add(entry.getValue());
            arrayList.add(list);
        }
        arrayList.sort(Comparator.comparingInt(o -> o.get(0)));
        return arrayList;
    }
}
